package com.hsq.ndmall.common.config.login;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.nimbusds.jose.JWSObject;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

/**
 * @author 黄四清
 * @version 1.0.0
 * @ClassName LoginUserHandlerMethodArgumentResolver.java
 * @Description TODO 登录用户处理程序方法参数解析器
 * <p>
 * HandlerMethodArgumentResolver(默认)：是将我们的url的参数绑定到从controller的发送的参数上。例如：http://localhost:8080?id=10086
 * 这个类主要用于，我们userID在请求头中的jwt，我们需要解释处理并绑定到controller中。
 * @createTime 2021年08月30日 14:48:00
 */

public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    //1.什么参数接口才解析？
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        //如果接口方法参数类型为Integer并且这个参数上有LoginUser注解，那么我们自己解析
        return methodParameter.getParameterType().isAssignableFrom(Integer.class) && methodParameter.hasParameterAnnotation(LoginUser.class);
    }

    //2、怎么去解释接口参数
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        // 1、从请求头中获取JWT
        String token = nativeWebRequest.getHeader("Authorization");
        // 2、非空判断
        if (StrUtil.isEmpty(token)) {
            return null;
        }
        //3.从token中解析用户信息
        System.out.println(token);
        String realToken = token.replace("Bearer ", "");
        System.out.println(realToken + "realToken:===========================1");
        JWSObject jwsObject = JWSObject.parse(realToken);
        String userStr = jwsObject.getPayload().toString();
        System.out.println(userStr + "userStr:===========================2" + JSONUtil.parseObj(userStr).get("id"));
        // 解释我们token，从jwt获取用户信息ID
        return JSONUtil.parseObj(userStr).get("id");
    }
}
